#!/usr/bin/env python
# coding: utf-8

# # PaddleOcr 实现车牌识别
# 
# 用PaddleOcr模型实现车牌识别
# 
# # 一、项目背景
# 车牌识别广泛运用于例如停车场、收费站等等场景，提供高效快捷的车辆认证模型。
# =》检测图片的文本位置
# =》识别文本信息
# 
# # 二、数据集简介
# 本次使用的数据集为CCPD2019车牌数据集
# 挑选了18张不同角度、采光、距离、清晰度的摄像头进行训练
# 
# ## 1.数据加载和预处理
# 
# ```python
# !pip install paddlepaddle==2.1.1
# !pip install paddleocr==2.0.2 paddlehub==2.0.4
# import matplotlib.pyplot as plt 
# import matplotlib.image as mpimg 
# ```
# 
# 
# 
# ## 2.数据集查看
# 
# ```python
# !cat test.txt
# with open('test.txt', 'r') as f:
#     test_img_path=[]
#     for line in f:
#         test_img_path.append(line.strip())
# print(test_img_path)
# ```
# 
# 
# # 三、模型选择和开发
# 
# 典型的OCR技术路线如下图所示：
# 
# 
# 
# 其中OCR识别的关键路径在于文字检测和文本识别部分，这也是深度学习技术可以充分发挥功效的地方。PaddleHub为大家开源的预训练模型的网络结构是Differentiable Binarization+ CRNN，基于icdar2015数据集下进行的训练。
# 
# 首先，DB是一种基于分割的文本检测算法。在各种文本检测算法中，基于分割的检测算法可以更好地处理弯曲等不规则形状文本，因此往往能取得更好的检测效果。但分割法后处理步骤中将分割结果转化为检测框的流程复杂，耗时严重。因此作者提出一个可微的二值化模块（Differentiable Binarization，简称DB），将二值化阈值加入训练中学习，可以获得更准确的检测边界，从而简化后处理流程。DB算法最终在5个数据集上达到了state-of-art的效果和性能。参考论文：Real-time Scene Text Detection with Differentiable Binarization
# 
# 
# 
# 
# 接着，我们使用 CRNN（Convolutional Recurrent Neural Network）即卷积递归神经网络，是DCNN和RNN的组合，专门用于识别图像中的序列式对象。与CTC loss配合使用，进行文字识别，可以直接从文本词级或行级的标注中学习，不需要详细的字符级的标注。参考论文:An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition
# 
# 
# 
# 
# ## 1.预训练模型
# 
# ```python
# 
# import paddlehub as hub
# 
# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# !pip install shapely
# !pip install pyclipper
# import cv2
# 
# ```
# 
# ## 2.读取测试文件夹test.txt中的照片路径
# 
# 
# ```python
# np_images =[cv2.imread(image_path) for image_path in test_img_path] 
# 
# 
#  ```
#         
# 
# ## 3.训练模型
# 
# 
# ```python
# results = ocr.recognize_text(
#                     images=np_images,         # 图片数据，ndarray.shape 为 [H, W, C]，BGR格式；
#                     use_gpu=False,            # 是否使用 GPU；若使用GPU，请先设置CUDA_VISIBLE_DEVICES环境变量
#                     output_dir='ocr_result',  # 图片的保存路径，默认设为 ocr_result；
#                     visualization=True,       # 是否将识别结果保存为图片文件；
#                     box_thresh=0.5,           # 检测文本框置信度的阈值；
#                     text_thresh=0.5)          # 识别中文文本置信度的阈值；
# 
# for result in results:
#     data = result['data']
#     save_path = result['save_path']
#     for infomation in data:
#          print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ', infomation['text_box_position'])
# ```
# 
# 
# 
# # 四、调参优化
# 套件：paddleocr
# 
# 优化器：Momentum
# 
# 调整参数：增加了 warmup_steps 100 同时增加了steps 到1000 在加入了warmip_steps后 准确率略有上升。 原始的steps为100 在增加到1000后发现 图片识别的准确率下降速率减缓 单个图片的识别率略有提升
# 
# 心得：
# 
# # 五、总结与升华
# 
# 实际运用了paddle相关套件 熟悉了使用paddledetection来搭建任务代码 对于SDG和Momentum优化器的区别以及各自的优势进行了学习 对于学习的参数 例如基本学习速率等有了实际的运用以及调整 能够通过函数输出的结果进行调整参数以及 增加参数以达到更高的识别率
# 
